package com.yxy.system.service.impl;

import java.util.Date;
import java.util.List;
import java.util.Map;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.yxy.common.core.domain.AjaxResult;
import com.yxy.common.enums.ProcessSourceEnum;
import com.yxy.common.enums.ResultStatusEnum;
import com.yxy.common.utils.DateUtils;
import com.yxy.common.utils.StringUtils;
import com.yxy.system.domain.ReportTipLog;
import com.yxy.system.domain.vo.ReportTipDto;
import com.yxy.system.mapper.ReportTipLogMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.yxy.system.mapper.ReportTipMapper;
import com.yxy.system.domain.ReportTip;
import com.yxy.system.service.IReportTipService;

/**
 * 报告提示Service业务层处理
 * 
 * @author 402844673@qq.com
 * @date 2025-08-28
 */
@Service
public class ReportTipServiceImpl implements IReportTipService 
{
    @Autowired
    private ReportTipMapper reportTipMapper;


    @Autowired
    ReportTipLogMapper reportTipLogMapper;

    /**
     * 查询报告提示
     * 
     * @param id 报告提示主键
     * @return 报告提示
     */
    @Override
    public ReportTip selectReportTipById(Long id)
    {
        return reportTipMapper.selectReportTipById(id);
    }

    /**
     * 查询报告提示列表
     * 
     * @param reportTip 报告提示
     * @return 报告提示
     */
    @Override
    public List<ReportTip> selectReportTipList(ReportTip reportTip)
    {
        return reportTipMapper.selectReportTipList(reportTip);
    }

    /**
     * 新增报告提示
     * 
     * @param reportTip 报告提示
     * @return 结果
     */
    @Override
    public int insertReportTip(ReportTip reportTip)
    {
        reportTip.setCreateTime(DateUtils.getNowDate());
        return reportTipMapper.insertReportTip(reportTip);
    }

    /**
     * 修改报告提示
     * 
     * @param reportTip 报告提示
     * @return 结果
     */
    @Override
    public int updateReportTip(ReportTip reportTip)
    {
        reportTip.setUpdateTime(DateUtils.getNowDate());
        return reportTipMapper.updateReportTip(reportTip);
    }

    /**
     * 批量删除报告提示
     * 
     * @param ids 需要删除的报告提示主键
     * @return 结果
     */
    @Override
    public int deleteReportTipByIds(Long[] ids)
    {
        return reportTipMapper.deleteReportTipByIds(ids);
    }

    /**
     * 删除报告提示信息
     * 
     * @param id 报告提示主键
     * @return 结果
     */
    @Override
    public int deleteReportTipById(Long id)
    {
        return reportTipMapper.deleteReportTipById(id);
    }

    private static final String[] API_FIELDS = {
            "apiPatientApply", "apiPatientCheck", "apiPatientReport",
            "apiReportSnapshot", "apiImageSequence", "apiImageVideo",
            "apiSettlement", "apiDicomFile"
    };


    @Override
    public AjaxResult validateReportTipDto(ReportTipDto dto) {
        // 检查至少有一个API tip不为空
        boolean hasData = false;
        for (int i = 0; i < API_FIELDS.length; i++) {
            try {
                java.lang.reflect.Field field = ReportTipDto.class.getDeclaredField(API_FIELDS[i]);
                field.setAccessible(true);
                Map<String, String> tipMap = (Map<String, String>) field.get(dto);
                if (tipMap != null && !tipMap.isEmpty()) {
                    hasData = true;
                    // 校验map内容
                    String flagStr = tipMap.get("flagStr");
                    String msg = tipMap.get("msg");

                    if (flagStr == null || flagStr.trim().isEmpty()) {
                        return AjaxResult.error(API_FIELDS[i] + "的flagStr不能为空");
                    }

                    if ("Y".equals(flagStr) && (msg == null || msg.trim().isEmpty())) {
                        return AjaxResult.error(API_FIELDS[i] + "的MSG不能为空，当flagStr为Y时");
                    }
                }
            } catch (Exception e) {
                return AjaxResult.error("数据校验异常: " + e.getMessage());
            }
        }

        if (!hasData) {
            return AjaxResult.error("至少需要提供一条API提示数据");
        }
        return AjaxResult.success();
    }

    @Override
    public AjaxResult loadData(ReportTipDto reportTipDto) {
        AjaxResult checkProcessOrder=checkProcessOrder(reportTipDto);
        if (!checkProcessOrder.isSuccess()) {
            return checkProcessOrder;
        }
        // 判断是新增还是更新
        ReportTip existingTip = reportTipMapper.selectReportTipByUniqueKey(
                reportTipDto.getFixmedinsCode(),
                reportTipDto.getSystemId(),
                reportTipDto.getRisStudyId());


        ReportTip reportTip = convertDtoToEntity(reportTipDto,existingTip);

         ReportTipLog reportTipLog = convertDtoLogToEntity(reportTipDto);
        // 再次校验其status和exceptionFields是否不对齐
        int result;
        if (existingTip == null) {
            // 新增
            reportTip.setCreateTime(new Date());
            result = insertReportTip(reportTip);
        } else {
            // 更新
            reportTip.setId(existingTip.getId()); // 设置ID用于更新
            result = reportTipMapper.updateReportTipDirect(reportTip);
        }
        reportTipLogMapper.insertReportTipLog(reportTipLog);
        return result > 0 ? AjaxResult.success() : AjaxResult.error("操作失败");
    }

    private ReportTipLog convertDtoLogToEntity(ReportTipDto dto) {
        ReportTipLog reportTipLog = new ReportTipLog();
        reportTipLog.setFixmedinsCode(dto.getFixmedinsCode());
        reportTipLog.setSystemId(dto.getSystemId());
        reportTipLog.setRisStudyId(dto.getRisStudyId());
        reportTipLog.setSource(dto.getSource());
        reportTipLog.setUpdateTime(new Date());
        reportTipLog.setOperParam(JSONUtil.toJsonStr(dto));
        reportTipLog.setCreateTime(new Date());
        boolean hasException = false;
        // 处理每个 API 字段
        for (String fieldName : API_FIELDS) {
            try {
                java.lang.reflect.Field dtoField = ReportTipDto.class.getDeclaredField(fieldName);
                dtoField.setAccessible(true);
                Map<String, String> tipMap = (Map<String, String>) dtoField.get(dto);

                if (tipMap != null) {
                    String flagStr = tipMap.get("flagStr");
                    String msg = tipMap.get("msg");

                    // 获取当前字段的 JSON 字符串
                    java.lang.reflect.Field entityField = ReportTipLog.class.getDeclaredField(fieldName);
                    entityField.setAccessible(true);
                    String jsonStr = (String) entityField.get(reportTipLog);
                    JSONObject json = StringUtils.isNotEmpty(jsonStr) ? JSONUtil.parseObj(jsonStr) : new JSONObject();

                    if ("N".equals(flagStr)) {
                        // 移除当前节点的信息
                        json.remove(dto.getSource());
                    } else if ("Y".equals(flagStr)) {
                        // 设置或更新当前节点的信息
                        JSONObject nodeInfo = new JSONObject();
                        nodeInfo.set("msg", msg);
                        nodeInfo.set("updateTime", DateUtils.getNowDate());
                        json.set(dto.getSource(), nodeInfo);
                        hasException = true; // 标记有异常信息
                    }

                    // 如果 JSON 对象为空，设置为 null，否则设置为 JSON 字符串
                    if (json.isEmpty()) {
                        entityField.set(reportTipLog, null);
                    } else {
                        entityField.set(reportTipLog, json.toString());
                        hasException = true; // 确保即使当前操作是删除，其他节点信息仍然存在时也标记为异常
                    }
                }
            } catch (Exception e) {
                // 记录日志，继续处理其他字段
            }
        }
        // 设置整体状态
        reportTipLog.setStatus(hasException ? 1 : 0);
        return reportTipLog;
    }

    private ReportTip convertDtoToEntity(ReportTipDto dto, ReportTip existingTip) {
        ReportTip reportTip = existingTip != null ? existingTip : new ReportTip();
        reportTip.setFixmedinsCode(dto.getFixmedinsCode());
        reportTip.setSystemId(dto.getSystemId());
        reportTip.setRisStudyId(dto.getRisStudyId());
        reportTip.setSource(dto.getSource());
        reportTip.setUpdateTime(new Date());

        // 初始化所有 API 字段为 null（如果是新增）
        if (existingTip == null) {
            for (String field : API_FIELDS) {
                try {
                    java.lang.reflect.Field entityField = ReportTip.class.getDeclaredField(field);
                    entityField.setAccessible(true);
                    entityField.set(reportTip, null);
                } catch (Exception e) {
                    // ignore
                }
            }
        }

        boolean hasException = false;

        // 处理每个 API 字段
        for (String fieldName : API_FIELDS) {
            try {
                java.lang.reflect.Field dtoField = ReportTipDto.class.getDeclaredField(fieldName);
                dtoField.setAccessible(true);
                Map<String, String> tipMap = (Map<String, String>) dtoField.get(dto);

                if (tipMap != null) {
                    String flagStr = tipMap.get("flagStr");
                    String msg = tipMap.get("msg");

                    // 获取当前字段的 JSON 字符串
                    java.lang.reflect.Field entityField = ReportTip.class.getDeclaredField(fieldName);
                    entityField.setAccessible(true);
                    String jsonStr = (String) entityField.get(reportTip);
                    JSONObject json = StringUtils.isNotEmpty(jsonStr) ? JSONUtil.parseObj(jsonStr) : new JSONObject();

                    if ("N".equals(flagStr)) {
                        // 移除当前节点的信息
                        json.remove(dto.getSource());
                    } else if ("Y".equals(flagStr)) {
                        // 设置或更新当前节点的信息
                        JSONObject nodeInfo = new JSONObject();
                        nodeInfo.set("msg", msg);
                        nodeInfo.set("updateTime", DateUtils.getNowDate());
                        json.set(dto.getSource(), nodeInfo);
                        hasException = true; // 标记有异常信息
                    }

                    // 如果 JSON 对象为空，设置为 null，否则设置为 JSON 字符串
                    if (json.isEmpty()) {
                        entityField.set(reportTip, null);
                    } else {
                        entityField.set(reportTip, json.toString());
                        hasException = true; // 确保即使当前操作是删除，其他节点信息仍然存在时也标记为异常
                    }
                }
            } catch (Exception e) {
                // 记录日志，继续处理其他字段
            }
        }
        // 设置整体状态
        reportTip.setStatus(hasException ? 1 : 0);
        return reportTip;
    }


    private AjaxResult checkProcessOrder(ReportTipDto dto) {
//        String currentSource = dto.getSource();
//        Integer currentOrder = ProcessSourceEnum.getOrderByCode(currentSource);
//
//        if (currentOrder == null) {
//            return AjaxResult.error("非法的系统来源: " + currentSource);
//        }
        ResultStatusEnum resultStatusEnum=ResultStatusEnum.getByCode(dto.getStatus());
        if (resultStatusEnum == null) {
            return AjaxResult.error("非法的结果状态" );
        }
        return AjaxResult.success();
    }

    @Override
    public String feedbackDetail(Long id, String field) {
        return "";
    }
}
